package com.portal.config.mq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 超时未支付延迟队列的配置
 * 普通：
 *      队列：order.queue
 *          绑定死信交换机：  【order.key.dlx】
 *          绑定死信路由key：【order.dlx.exchange】
 *          TTL： 45min
 *          最大长度：30000
 *      交换机：order.exchange
 *      路由key：order.key.normal
 * 死信：
 *      队列：order.dlx.queue
 *      交换机：order.dlx.exchange
 *      路由key：order.key.dlx
 */
@Configuration
@Slf4j
public class RabbitCancelOrderConfig {
    //普通订单队列，指定死信交换机和路由键
    @Bean
    public Queue orderQueue() {
        return QueueBuilder.durable("order.queue")  //订单队列
                .deadLetterExchange("order.dlx.exchange")  //设置死信交换机
                .deadLetterRoutingKey("order.key.dlx")      //设置死信路由键
                .ttl(1 * 60 * 1000)   //默认是40分钟 (开发阶段1分钟)
                .maxLength(30000)   //最大长度
                .build();
    }

    //普通交换机
    @Bean
    public DirectExchange orderExchange() {
        return new DirectExchange("order.exchange");
    }

    //普通订单队列绑定普通交换机
    @Bean
    public Binding orderBinding(
            @Qualifier("orderQueue") Queue orderQueue,
            @Qualifier("orderExchange") DirectExchange orderExchange) {
        return BindingBuilder.bind(orderQueue).to(orderExchange).with("order.key.normal");
    }

    //死信队列
    @Bean
    public Queue orderDlxQueue() {
        return new Queue("order.dlx.queue");
    }

    //死信交换机
    @Bean
    public DirectExchange orderDlxExchange() {
        return new DirectExchange("order.dlx.exchange");
    }

    //死信队列绑定死信交换机
    @Bean
    public Binding orderDlxBinding(
            @Qualifier("orderDlxQueue") Queue orderDlxQueue,
            @Qualifier("orderDlxExchange") DirectExchange orderDlxExchange) {
        return BindingBuilder.bind(orderDlxQueue).to(orderDlxExchange).with("order.key.dlx");
    }
}